PriorBox
根据输入的特征图尺寸、步长和预设的候选框配置,逐元素计算先验框(Prior Boxes),通常用于目标检测模型。
该算子遍历特征图的每一个网格中心点,并围绕该中心点生成一系列具有不同尺寸和宽高比的候选框。生成的坐标 [xmin, ymin, xmax, ymax] 经过归一化处理。
对于每个 min_sizes[k] :
当 max_sizes_size > 0 时,额外生成尺寸为 \(\sqrt{min_k \cdot max_k}\) 的正方形先验框。
对于每个 different_aspect_ratios[m] (不等于 1.0 时):
- 输入:
min_sizes - 定义基础先验框尺寸的浮点数数组地址。
max_sizes - 可选的浮点数数组地址,用于生成额外的正方形先验框。
different_aspect_ratios - 定义不同宽高比的浮点数数组地址。
output - 用于存储最终生成的先验框坐标的数组地址。
- params - 参数数组(9个元素),包含以下内容:
params[0]: 特征图高度 fmap_h(int)
params[1]: 特征图宽度 fmap_w(int)
params[2]: 垂直步长 step_h 的地址(float*)
params[3]: 水平步长 step_w 的地址(float*)
params[4]: 中心点偏移量 offset 的地址(float*)
params[5]: min_sizes 数组长度
params[6]: max_sizes 数组长度
params[7]: different_aspect_ratios 数组长度
params[8]: output_size 整数变量的地址(int*),函数执行后记录写入 output 的浮点数总数
core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
output - 生成的先验框坐标。
output_size - 写入 output 数组的浮点数总数(通过 params[8] 指向的变量返回)。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持 fp32 类型。
MT7004 支持 fp16 和 fp32 类型。
当 max_sizes_size 为 0 时,不生成额外的正方形先验框。
当宽高比等于 1.0 时,跳过该宽高比对应的先验框生成。
共享存储版本:
-
void fp_prior_box_s(float *min_sizes, float *max_sizes, float *different_aspect_ratios, float *output, long long *params, int core_mask)
-
void hp_prior_box_s(float16 *min_sizes, float16 *max_sizes, float16 *different_aspect_ratios, float16 *output, long long *params, int core_mask)
C调用示例:
1// MT7004 示例(共享存储多核,DDR 地址)
2#include <stdio.h>
3#include <stdlib.h>
4#include "mt7004/utils.h"
5
6int main() {
7 float *min_sizes = (float *)0x81000000;
8 float *max_sizes = (float *)0x82000000;
9 float *ratios = (float *)0x83000000;
10 float *output = (float *)0x84000000;
11 int *output_size = (int *)0x86000000;
12
13 int i;
14 int fmap_h = 4, fmap_w = 8;
15 float step_h = 2.0f, step_w = 2.0f;
16 float offset = 0.5f;
17 int min_sizes_size = 2;
18 int max_sizes_size = 0;
19 int ratios_size = 0;
20 int core_mask = 0xff;
21
22 srand(12345);
23 for (i = 0; i < min_sizes_size; ++i) {
24 min_sizes[i] = (float)(rand() % 3 + 1);
25 }
26
27 long long params[13];
28 params[0] = (long long)fmap_h;
29 params[1] = (long long)fmap_w;
30 params[2] = (long long)(&step_h);
31 params[3] = (long long)(&step_w);
32 params[4] = (long long)(&offset);
33 params[5] = (long long)min_sizes_size;
34 params[6] = (long long)max_sizes_size;
35 params[7] = (long long)ratios_size;
36 params[8] = (long long)output_size;
37
38 fp_prior_box_s(min_sizes, max_sizes, ratios, output, params, core_mask);
39
40 return 0;
41}
私有存储版本:
-
void fp_prior_box_p(float *min_sizes, float *max_sizes, float *different_aspect_ratios, float *output, long long *params)
-
void hp_prior_box_p(float16 *min_sizes, float16 *max_sizes, float16 *different_aspect_ratios, float16 *output, long long *params)
C调用示例:
1// MT7004 示例(私有存储单核,AM 地址)
2#include <stdio.h>
3#include <stdlib.h>
4#include "mt7004/utils.h"
5
6int main() {
7 float *min_sizes = (float *)0x10010000;
8 float *max_sizes = (float *)0x10016000;
9 float *ratios = (float *)0x10020000;
10 float *output = (float *)0x10030000; // 需保证足够的 DDR/AM 空间
11 int *output_size = (int *)0x10050000;
12
13 int i;
14 int fmap_h = 4, fmap_w = 8;
15 float step_h = 2.0f, step_w = 2.0f;
16 float offset = 0.5f;
17 int min_sizes_size = 2;
18 int max_sizes_size = 0;
19 int ratios_size = 0;
20
21 srand(12345);
22 for (i = 0; i < min_sizes_size; ++i) {
23 min_sizes[i] = (float)(rand() % 3 + 1);
24 }
25
26 long long params[13];
27 params[0] = (long long)fmap_h;
28 params[1] = (long long)fmap_w;
29 params[2] = (long long)(&step_h);
30 params[3] = (long long)(&step_w);
31 params[4] = (long long)(&offset);
32 params[5] = (long long)min_sizes_size;
33 params[6] = (long long)max_sizes_size;
34 params[7] = (long long)ratios_size;
35 params[8] = (long long)output_size;
36
37 fp_prior_box_p(min_sizes, max_sizes, ratios, output, params);
38
39 return 0;
40}